#pragma once


#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
#include <fcntl.h>

//设置一个sock成为非阻塞
void SetNonBlock(int sock)
{
    int fl = fcntl(sock, F_GETFL);//获取该文件描述符的状态标志位
    if (fl < 0)
    {
        std::cerr << "fcntl failed" << std::endl;
        return;
    }
    fcntl(sock, F_SETFL, fl | O_NONBLOCK);//设置标志位, 非阻塞
}

// 分包-- 一个或者多个报文 -- 解决粘包问题
void SplitSegment(std::string &inbuffer, std::vector<std::string> *tokens, std::string sep)
{
    while (true)
    {
        std::cout << "inbuffer: " << inbuffer << std::endl;//把报文处理情况打印出来
        auto pos = inbuffer.find(sep);
        if(pos == std::string::npos) //剩余的是不完整的报文
        {
            break;//不处理！
        }
        //读到了完整的报文
        std::string sub = inbuffer.substr(0, pos); //[) 左闭右开
        tokens->push_back(sub);
        inbuffer.erase(0, pos+1); //删除[0,pos+1)的内容
    }
}

struct data{
	int _x;
	int _y;
	char _op;
};

static bool Deserialize(std::string& in, int* x, int* y, char* op)
{
    size_t pos = 0;
    for (pos = 0; pos < in.size(); pos++)
    {
        //找到操作符的位置
        if (in[pos] == '+' || in[pos] == '-' || in[pos] == '*' || in[pos] == '/' || in[pos] == '%')
            break;
    }
    //[0,pos-1] pos [pos+1,in.size()-1] 左操作数 操作符 右操作数
    if (pos < in.size()){
        std::string left = in.substr(0, pos);
        std::string right = in.substr(pos + 1);

        *x = atoi(left.c_str());
        *y = atoi(right.c_str());
        *op = in[pos];
        return true;
    }
    else{
        *op = -1;
        return false;
    }
}
